Android Tips #29 Android 1.6 から ListFragment と DialogFragment を使う
はじめに
前回は Android 1.6 から Fragment を使う基本について解説しました。今回は Fragment のサブクラスである ListFragment と DialogFragment の使いかたについて解説したいと思います!
ListFragment でリストを表示する
1. FragmentActivity を継承した Activity をつくる
前回同様 FragmentActivity を継承した Activity を作成します。Fragment を扱う場合は必ず FragmentActivity を継承しなければいけません。
2. ListFragment をインスタンス化して Adapter をセットする
次に ListFragment に表示するアイテムリストの Adapter をつくります。まずは普通に String の ArrayAdapter をつくってみます。アイテムのレイアウトは標準で用意されている android.R.layout.simple_list_item_1 を使いました。 そして ListFragment をインスタンス化し、 setAdapter() でつくった Adapter をセットします。
ArrayAdapter<String> adapter = new ArrayAdapter<String>( this, android.R.layout.simple_list_item_1); adapter.add("ゴール・D・ロジャー"); adapter.add("モンキー・D・ルフィ"); adapter.add("モンキー・D・ガープ"); adapter.add("モンキー・D・ドラゴン"); adapter.add("ポートガス・D・エース"); adapter.add("マーシャル・D・ティーチ"); adapter.add("ハグワール・D・サウロ"); ListFragment frag = new ListFragment(); frag.setListAdapter(adapter);
3. レイアウトに追加する
つくった ListFragment をレイアウトに追加します。FragmentActivity#getSupportFragmentManager() で FragmentManager を呼び出し、 FragmentManager#beginTransaction() で FragmentTransaction を呼び出します。FragmentTransaction#add() でレイアウトに追加、 commit() して終わりです!
FragmentManager manager = getSupportFragmentManager(); FragmentTransaction tx = manager.beginTransaction(); tx.add(android.R.id.content, frag, "list_fragment"); tx.commit();
DialogFragment でダイアログを表示する
1. DialogFragment を継承したカスタムクラスをつくる
まず、DialogFragment を継承したカスタムクラスをつくりましょう。継承元のクラスは android.support.v4.app.DialogFragment です。android.app.DialogFragment ではないので注意しましょう。
そして onCreateDialog() をオーバーライドし、その中で Dialog をつくります。Dialog の作りかたは以前までと同様です。
package jp.classmethod.android.sample.dialogfragment; import android.app.AlertDialog; import android.app.Dialog; import android.os.Bundle; import android.support.v4.app.DialogFragment; public class AlertDialogFragment extends DialogFragment { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle("タイトル"); builder.setMessage("メッセージ"); builder.setPositiveButton(android.R.string.ok, null); builder.setNegativeButton(android.R.string.cancel, null); return builder.create(); } }
2. FragmentActivity を継承した Activity をつくる
ListFragment のときと同様、 FragmentActivity を継承した Activity をつくります。
3. DialogFragment をインスタンス化し show() メソッドを呼ぶ
最後に作成した DialogFragment クラスをインスタンス化し、 DialogFragment#show() を呼ぶと Dialog が表示されます。このときの引数には getSupportFragmentManager() か getSupportFragmentManager().beginTransaction() を渡します。
AlertDialogFragment frag = new AlertDialogFragment(); frag.show(getSupportFragmentManager(), "alert_dialog_fragment");
showDialog() は非推奨!
これまでは Activity#showDialog() で表示していましたが、こちらは非推奨となったため Warning が出るようになっています。
ダイアログを表示したい場合は DialogFragment を使って実装しましょう。
ListFragment で選択したアイテムを DialogFragment で表示する
最後に、合わせ技してみました。ListFragment で選択されたアイテムを DialogFragment で Bundle で渡して表示するサンプルです。DialogFragment とのデータの受け渡しは Bundle でやりとりします。DialogFragment を呼ぶ側から setArgments() でセットし、DialogFragment 側からは onCreateDialog() 内で getArgments() を呼んで取得します。ListFragment#getListView() をしているタイミングは onPostCreate() になっているのは onCreate() のときにはまだ ListView がないので NullpointerException が発生してしまうためです。
MainActivity.java
package jp.classmethod.android.sample.dialogfragment; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.support.v4.app.ListFragment; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; public class MainActivity extends FragmentActivity { private ListFragment mFragment; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // ListFragment に渡す ArrayAdapter を作成 ArrayAdapter<String> adapter = new ArrayAdapter<String>( this, android.R.layout.simple_list_item_1); adapter.add("ゴール・D・ロジャー"); adapter.add("モンキー・D・ルフィ"); adapter.add("モンキー・D・ガープ"); adapter.add("モンキー・D・ドラゴン"); adapter.add("ポートガス・D・エース"); adapter.add("マーシャル・D・ティーチ"); adapter.add("ハグワール・D・サウロ"); // ListFragment を作成し Adapter をセット mFragment = new ListFragment(); mFragment.setListAdapter(adapter); // ListFragment をレイアウトに追加 FragmentManager manager = getSupportFragmentManager(); FragmentTransaction tx = manager.beginTransaction(); tx.add(android.R.id.content, mFragment, "list_fragment"); tx.commit(); } @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); // アイテムをタップしたときの動作 mFragment.getListView().setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) { // 対象のアイテムを取得 String name = (String) mFragment.getListAdapter().getItem(position); // Bundle を作成 Bundle bundle = new Bundle(); bundle.putString("name", name); // DialogFragment を表示 AlertDialogFragment dialog = new AlertDialogFragment(); dialog.setArguments(bundle); dialog.show(getSupportFragmentManager(), "alert_dialog_fragment"); } }); } }
DialogFragment.java
package jp.classmethod.android.sample.dialogfragment; import android.app.AlertDialog; import android.app.Dialog; import android.os.Bundle; import android.support.v4.app.DialogFragment; public class AlertDialogFragment extends DialogFragment { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { // Bundle からデータを取得 String name = getArguments().getString("name"); AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle("タイトル"); builder.setMessage(name); builder.setPositiveButton(android.R.string.ok, null); builder.setNegativeButton(android.R.string.cancel, null); return builder.create(); } }
まとめ
今回は簡単ではありますが ListFragment と DialogFragment についての Support Package を使った実装方法を解説しました。 ListFragment を使うと ListView を Fragment 化したいときに非常に簡単に実装できます。Fragment はこれからのレイアウト作りに欠かせないので、リストを使いたいときにはぜひ活用していきましょう! いっぽうダイアログを表示したいときは Activity#showDialog() が非推奨になっているので DialogFragment を使うようにしましょう。